// 定义打包配置函数，传入配置对象opt，包含入口目录、别名和输出目录等信息
// 此函数用于配置Vite打包的相关参数，包括入口文件、别名和输出目录等
module.exports = (
    opt = {
        entryDir: '../../lib-install/asai/',
        alias: '../../src',
        outDir: '../../lib/asai/',
    }
) => {
    // 导入path模块，用于处理文件路径，确保路径在不同操作系统上的兼容性
    const path = require('path');
    // 导入vite的defineConfig和build函数，用于定义和执行打包配置
    // defineConfig用于创建Vite配置对象，build用于执行打包操作
    const { defineConfig, build } = require('vite');
    // 导入vue插件，用于支持vue文件的打包，确保Vite能够正确处理Vue组件
    const vue = require('@vitejs/plugin-vue');
    // 获取当前npm脚本的生命周期事件，并提取构建模块名称
    // 通过解析npm脚本的生命周期事件，确定当前要构建的模块
    const buildModule = (process.env.npm_lifecycle_event + ':').split(':')[1];

    const installFile =
        buildModule === 'index'
            ? './index.ts'
            : buildModule?.startsWith('asinstall')
            ? './asinstall.ts'
            : buildModule + '/index.ts';
    // 添加打包入口文件夹 packages（需要手动创建）
    // 使用path.resolve确保入口目录的路径是绝对路径
    const entryDir = path.resolve(__dirname, opt.entryDir);

    // vite 配置
    // 定义Vite的基础配置，包括插件、别名等
    const baseConfig = defineConfig({
        configFile: false,
        publicDir: false,
        plugins: [vue()],
        base: '/',
        resolve: {
            alias: {
                '@': path.resolve(__dirname, opt.alias),
            },
        }
    });

    // rollup 配置（vite 基于 rollup 打包）
    // 定义Rollup的配置，用于排除不需要打包的库和设置输出格式
    const rollupOptions = {
        // 不需要打包的库
        // 这些库将不会被打包到最终的构建文件中，而是在运行时从外部引入
        external: [
            'views/',
            'vue',
            'vue-router',
            'axios',
            'element-plus',
            'x6',
            'monaco-editor',
            'three',
            'monaco-editor/esm/vs/editor/editor.worker?worker',
            'monaco-editor/esm/vs/language/json/json.worker?worker',
            'monaco-editor/esm/vs/language/css/css.worker?worker',
            'monaco-editor/esm/vs/language/html/html.worker?worker',
            'monaco-editor/esm/vs/language/typescript/ts.worker?worker',
        ],
        output: {
            globals: {
                vue: 'Vue',
            },
        },
    };

    // 全量构建
    // 异步函数，用于执行全量构建操作
    const buildAll = async () => {
        await build(
            defineConfig({
                ...baseConfig,
                build: {
                    rollupOptions,
                    lib: {
                        entry: path.resolve(entryDir, `${installFile}`),
                        name: `as-${buildModule}-name`, // 组件库名字
                        fileName: `as-${buildModule}-file`,
                        formats: ['es'], // 输出格式，es项目中可直接use；umd在html文件中引入
                        // formats: ['es', 'umd'],
                    },
                    outDir: path.resolve(__dirname, opt.outDir + buildModule), // 添加出口文件夹 lib（不需要手动创建，会自动生成）
                    // outDir: path.resolve(__dirname, `../../public/js/${buildModule}`),
                },
            })
        );
    };

    // 同步构建处理
    // 异步函数，用于同步执行构建操作
    const buildLib = async () => {
        await buildAll();
    };

    // 启动构建
    // 调用buildLib函数开始构建过程
    buildLib();
};
